using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using Studio7i.Dominio;

namespace Studio7i.Persistencia
{
    public class InstrumentoDAO : IInstrumentoDAO
    {
        // Dependencias
        ISalaDAO salaDAO = new SalaDAO();
        // Métodos CRUD
        public Instrumento Crear(Instrumento instrumentoACrear)
        {
            string _Sentencia = "INSERT INTO Instrumento(CodInst,Tipo,Marca,Modelo,FechFabricacion,Caracteristicas,CostoHora,Estado)VALUES(@CodInst,@Tipo,@Marca,@Modelo,@FechFabricacion,@Caracteristicas,@CostoHora,@Estado)";

            int _NuevoCodigo = GenerarNuevoCodigo();
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@CodInst", _NuevoCodigo));
                    _Comando.Parameters.Add(new SqlParameter("@Tipo", instrumentoACrear.Tipo));
                    _Comando.Parameters.Add(new SqlParameter("@Marca", instrumentoACrear.Marca));
                    _Comando.Parameters.Add(new SqlParameter("@Modelo", instrumentoACrear.Modelo));
                    _Comando.Parameters.Add(new SqlParameter("@FechFabricacion", instrumentoACrear.FechFabricacion));
                    _Comando.Parameters.Add(new SqlParameter("@Caracteristicas", instrumentoACrear.Caracteristicas));
                    _Comando.Parameters.Add(new SqlParameter("@CostoHora", instrumentoACrear.CostoHora));
                    _Comando.Parameters.Add(new SqlParameter("@Estado", instrumentoACrear.Estado));
                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(_NuevoCodigo);
        }
        public Instrumento Obtener(int codigo)
        {
            string _Sentencia = "SELECT CodInst,Tipo,Marca,Modelo,FechFabricacion,Caracteristicas,CostoHora,Estado FROM Instrumento WHERE CodInst=@CodInst";
            Instrumento instrumentoCreado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@CodInst", codigo));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        if (_Resultado.Read())
                        {
                            instrumentoCreado = new Instrumento();
                            instrumentoCreado.CodInst = _Resultado.GetInt32(0);
                            instrumentoCreado.Tipo = _Resultado.GetString(1);
                            instrumentoCreado.Marca = (String)_Resultado["Marca"];
                            instrumentoCreado.Modelo = (String)_Resultado["Modelo"];
                            instrumentoCreado.FechFabricacion = (DateTime)_Resultado["FechFabricacion"];
                            instrumentoCreado.Caracteristicas = (String)_Resultado["Caracteristicas"];
                            instrumentoCreado.CostoHora = (int)_Resultado["CostoHora"];
                            instrumentoCreado.Estado = (bool)_Resultado["Estado"];

                        }
                    }
                }
            }
            return instrumentoCreado;
        }
        public Instrumento Modificar(Instrumento instrumentoAModificar)
        {
            string _Sentencia = "UPDATE Instrumento SET Tipo=@Tipo, Marca=@Marca,Modelo=@Modelo,FechFabricacion=@FechFabricacion,Caracteristicas=@Caracteristicas,CostoHora=@CostoHora,Estado=@Estado WHERE CodInst=@CodInst";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@Tipo", instrumentoAModificar.Tipo));
                    _Comando.Parameters.Add(new SqlParameter("@Marca", instrumentoAModificar.Marca));
                    _Comando.Parameters.Add(new SqlParameter("@CodInst", instrumentoAModificar.CodInst));
                    _Comando.Parameters.Add(new SqlParameter("@Modelo", instrumentoAModificar.Modelo));
                    _Comando.Parameters.Add(new SqlParameter("@FechFabricacion", instrumentoAModificar.FechFabricacion));
                    _Comando.Parameters.Add(new SqlParameter("@Caracteristicas", instrumentoAModificar.Caracteristicas));
                    _Comando.Parameters.Add(new SqlParameter("@CostoHora", instrumentoAModificar.CostoHora));
                    _Comando.Parameters.Add(new SqlParameter("@Estado", instrumentoAModificar.Estado));
                    _Comando.ExecuteNonQuery();
                }
            }
            return Obtener(instrumentoAModificar.CodInst);
        }
        public void Eliminar(Instrumento instrumentoAEliminar)
        {
            string _Sentencia = "DELETE FROM Instrumento WHERE CodInst=@CodInst";
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@CodInst", instrumentoAEliminar.CodInst));
                    _Comando.ExecuteNonQuery();
                }
            }
        }

        // Métodos Listar
        public ICollection<Instrumento> ListarTodos()
        {
            string _Sentencia = "SELECT CodInst,Tipo,Marca,Modelo,FechFabricacion,Caracteristicas,CostoHora,Estado FROM Instrumento";
            ICollection<Instrumento> instrumentosEncontrados = new List<Instrumento>();
            Instrumento instrumentoEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            instrumentoEncontrado = new Instrumento();
                            instrumentoEncontrado.CodInst = _Resultado.GetInt32(0);
                            instrumentoEncontrado.Tipo = _Resultado.GetString(1);
                            instrumentoEncontrado.Marca = (String)_Resultado["Marca"];
                            instrumentoEncontrado.Modelo = (String)_Resultado["Modelo"];
                            //instrumentoEncontrado.FechFabricacion = (DateTime)_Resultado["FechFabricacion"];
                            if (DBNull.Value.Equals(_Resultado["FechFabricacion"])) // No hay datos en la tabla

                                instrumentoEncontrado.FechFabricacion = DateTime.ParseExact("1900", "yyyy", null);
                            else
                                instrumentoEncontrado.FechFabricacion = (DateTime)_Resultado["FechFabricacion"];
                            instrumentoEncontrado.Caracteristicas = (String)_Resultado["Caracteristicas"];
                            instrumentoEncontrado.CostoHora = (int)_Resultado["CostoHora"];
                            instrumentoEncontrado.Estado = (bool)_Resultado["Estado"];
                            instrumentosEncontrados.Add(instrumentoEncontrado);
                        }
                    }
                }
            }
            return instrumentosEncontrados;
        }
        public ICollection<Instrumento> ListarXNombre(string nombre)
        {
            string _Sentencia = "SELECT CodInst,Tipo,Marca,Modelo,FechFabricacion,Caracteristicas,Costohora,Estado FROM Instrumento WHERE Marca LIKE '%'+@nombre+'%'";
            ICollection<Instrumento> instrumentosEncontrados = new List<Instrumento>();
            Instrumento instrumentoEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    _Comando.Parameters.Add(new SqlParameter("@nombre", nombre));
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            instrumentoEncontrado = new Instrumento();
                            instrumentoEncontrado.CodInst = _Resultado.GetInt32(0);
                            instrumentoEncontrado.Tipo = _Resultado.GetString(1);
                            instrumentoEncontrado.Marca = (String)_Resultado["Marca"];
                            instrumentoEncontrado.Modelo = (String)_Resultado["Modelo"];
                            instrumentoEncontrado.FechFabricacion = (DateTime)_Resultado["FechFabricacion"];
                            instrumentoEncontrado.Caracteristicas = (String)_Resultado["Caracteristicas"];
                            instrumentoEncontrado.CostoHora = (int)_Resultado["CostoHora"];
                            instrumentoEncontrado.Estado = (bool)_Resultado["Estado"];
                            instrumentosEncontrados.Add(instrumentoEncontrado);
                        }
                    }
                }
            }
            return instrumentosEncontrados;
        }
        public ICollection<Instrumento> ListarXBusqueda(int? CodInst, string Tipo, string Marca, string Modelo, DateTime FechFabricacion, String Caracteristicas, int? CostoHora, bool Estado, Sala sala)
        {
            string _Sentencia = @"SELECT CodInst, Tipo, Marca, Modelo, FechFabricacion, Caracteristicas, CostoHora, Estado, Sala FROM Instrumento WHERE 1=1";
            ICollection<Instrumento> instrumentosEncontrados = new List<Instrumento>();
            Instrumento instrumentoEncontrado = null;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand())
                {
                    if (CodInst != null)
                    {
                        _Sentencia = _Sentencia + " AND CodInst=@CodInst";
                        _Comando.Parameters.Add(new SqlParameter("@CodInst", CodInst));
                    }
                    if (Tipo != null)
                    {
                        _Sentencia = _Sentencia + " AND Tipo LIKE '%'+@Tipo+'%'";
                        _Comando.Parameters.Add(new SqlParameter("@Tipo", Tipo));
                    }
                    if (Marca != null)
                    {
                        _Sentencia = _Sentencia + " AND Marca LIKE '%'+@Marca+'%'";
                        _Comando.Parameters.Add(new SqlParameter("@Marca", Marca));
                    }
                    if (Modelo != null)
                    {
                        _Sentencia = _Sentencia + " AND Modelo=@Modelo";
                        _Comando.Parameters.Add(new SqlParameter("@Modelo", Modelo));
                    }
                    if (FechFabricacion != null)
                    {
                        _Sentencia = _Sentencia + " AND FechFabricacion=@Fabricacion";
                        _Comando.Parameters.Add(new SqlParameter("@lFechFabricacion", FechFabricacion));
                    }
                    if (Caracteristicas != null)
                    {
                        _Sentencia = _Sentencia + " AND Caracteristicas LIKE '%'+@Caracteristicas+'%'";
                        _Comando.Parameters.Add(new SqlParameter("@Caracteristicas", Caracteristicas));
                    }
                    if (CostoHora != null)
                    {
                        _Sentencia = _Sentencia + " AND CostoHora LIKE '%'+@CostoHora+'%'";
                        _Comando.Parameters.Add(new SqlParameter("@CostoHora", CostoHora));
                    }
                    // Buscando Estado
                        _Sentencia = _Sentencia + " AND Estado LIKE '%'+@Estado+'%'";
                        _Comando.Parameters.Add(new SqlParameter("@Estado", Estado));
                    
                    if (sala != null)
                    {
                        _Sentencia = _Sentencia + " AND sala=@sala";
                        _Comando.Parameters.Add(new SqlParameter("@sala", sala.CodSala));
                    }
                    _Comando.CommandText = _Sentencia;
                    _Comando.Connection = _Conexion;
                    using (SqlDataReader _Resultado = _Comando.ExecuteReader())
                    {
                        while (_Resultado.Read())
                        {
                            instrumentoEncontrado = new Instrumento();
                            instrumentoEncontrado.CodInst = (int)_Resultado["CodInst"];
                            instrumentoEncontrado.Tipo = (string)_Resultado["Tipo"];
                            instrumentoEncontrado.Marca = (string)_Resultado["Marca"];
                            instrumentoEncontrado.Modelo = (string)_Resultado["Modelo"];
                            instrumentoEncontrado.FechFabricacion = (DateTime)_Resultado["FechFabricacion"];
                            instrumentoEncontrado.Caracteristicas = (string)_Resultado["Caracteristicas"];
                            instrumentoEncontrado.CostoHora = (int)_Resultado["CostoHora"];
                            instrumentoEncontrado.Estado = (bool)_Resultado["Estado"];
                            instrumentoEncontrado.Sala = salaDAO.Obtener((int)_Resultado["sala"]);
                            instrumentosEncontrados.Add(instrumentoEncontrado);
                        }
                    }
                }
            }
            return instrumentosEncontrados;
        }
        
        // Métodos de soporte*/
        private int GenerarNuevoCodigo()
        {
            string _Sentencia = "SELECT max(CodInst) FROM Instrumento";
            int _NuevoCodigo = 0;
            using (SqlConnection _Conexion = new SqlConnection(ConexionUtil.ObtenerCadena()))
            {
                _Conexion.Open();
                using (SqlCommand _Comando = new SqlCommand(_Sentencia, _Conexion))
                {
                    object _Resultado = _Comando.ExecuteScalar();
                    if (DBNull.Value.Equals(_Resultado)) // No hay datos en la tabla
                        _NuevoCodigo = 1;
                    else
                        _NuevoCodigo = (int)_Resultado + 1;
                }
            }
            return _NuevoCodigo;
        }
    }
}